Java集成MongoDB查询ISODate问题 您所在的位置:网站首页 java mongodb 日期查询 Java集成MongoDB查询ISODate问题

Java集成MongoDB查询ISODate问题

2023-08-27 20:23| 来源: 网络整理| 查看: 265

Date sDate = DateUtils.parseDate(start, "yyyy-MM-dd HH:mm:ss"); Date eDate = DateUtils.parseDate(end, "yyyy-MM-dd HH:mm:ss"); Sort sort = Sort.by(Sort.Direction.ASC, "date_time"); Query query = new Query(); Criteria criteria = new Criteria(); criteria.and("point").in(pointIDs); criteria.and("date_time").gte(DateUtils.dateToISODate(sDate).getTime()) .lte(DateUtils.dateToISODate(eDate).getTime()); query.addCriteria(criteria); query.with(sort); mongoTemplate.find(query, VBTTrendCurve.class, TREND_CURVE); public static Date dateToISODate(Date date){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT"))); String isoDate = format.format(date); try { return format.parse(isoDate); } catch (ParseException e) { e.printStackTrace(); } return null; }

不废话,上代码,mongodb数据库中的date_time是ISODate类型,对应映射的是Date类型,现在有一个问题,如上代码对于时间的区间查询无法正取匹配,也就是说,gte和lte函数转化之后的数据不对。

WDNMD,怎么办,弄了很久,最后被逼无奈,采取原生方式进行解决:

StringBuilder pointsSB = new StringBuilder(); for (String item : pointIDs) { pointsSB.append("\""); pointsSB.append(item); pointsSB.append("\""); pointsSB.append(","); } StringBuilder stringBuilder = new StringBuilder("{\n" + " \"point\": {\n" + " \"$in\": [\n"); stringBuilder.append(pointsSB.toString().substring(0, pointsSB.toString().length() - 1)); stringBuilder.append(" ]\n" + " },\n" + " \"date_time\": {\n"); stringBuilder.append(" $gte: ISODate(\"" + DateUtils.getISODate(sDate) + "\"),\n"); stringBuilder.append(" $lte: ISODate(\"" + DateUtils.getISODate(eDate) + "\")\n"); stringBuilder.append(" }\n" + "}"); MongoCursor cursor = mongoTemplate.getCollection(TREND_CURVE).find(Document.parse(stringBuilder.toString())).iterator(); VBTTrendCurve vbtTrendCurve; while (cursor.hasNext()) { vbtTrendCurve = JSONObject.parseObject(JSON.toJSONString(cursor.next()), VBTTrendCurve.class); vbtTrendCurve.setDateTime(DateUtils.calDate(vbtTrendCurve.getDateTime(), Calendar.HOUR, -8)); result.add(vbtTrendCurve); } public static String getISODate(Date date){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "UTC"))); String isoDate = format.format(date); try { return formatDate(format.parse(isoDate) , "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); } catch (ParseException e) { e.printStackTrace(); } return null; }

原生方法可以解决ISODate问题,但是!需要用迭代器去进行遍历。我还是更倾向于用Query方式去做,所以,我还在继续摸索关于ISODate问题。

如果各位小伙伴有好的解决方案,请不吝赐教,谢谢。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有